#ifndef LEXER_H
#define LEXER_H

enum State {
    STATE_INIT,
    STATE_VAR,
    STATE_EQU,
    STATE_NUM,
};

enum TokenType {
    TT_VAR,
    TT_INTEGER,
    TT_STRING,
    TT_ASSIGN,

    TT_SEMICON,
    TT_LEFT_PAR,
    TT_RIGHT_PAR,

    TT_ADD,
    TT_SUB,
    TT_MUL,
    TT_DIV,

    TT_IF,
    TT_ELSE,
    TT_KW_INT,
    TT_KW_WHILE,
    TT_KW_PRINT,
    TT_LEFT_BRACKET,
    TT_RIGHT_BRACKET,

    TT_LT,
};

union TokenValue {
    char* _str;
    int   _int;
};

struct Token {
    enum TokenType _type;
    union TokenValue _value;
};

void log_token(struct Token* t);
void destroy_token(struct Token* t);
struct Token* create_token(enum TokenType tt, char* begin, char* cur);
struct Token* next_token();

#endif
